/*
int b = 0b1010;
int b1 = b << 3;
1010000
b >> 3
0001

C++ 中数字变量的长度
C++ 中数字的符号
在 C++ 里如何表达负数？
unsigned char c2 = 1;  0 <= c2 <= 255

char c3; 
0b1xxxxxxx;
0b01111111 + 1 = 0b00000000 = 0

unsigned char 0 ~ 255
char -128 ~ 127

MSB: Most Significant Bit 最重要位，最显著位
在计算机数字里，MSB 专门用来表达数字的符号。
255: 0b11111111
-1:  0b11111111

负数用正数的补码来表达 = 正数的二进制取反 + 1

二进制取反：把二进制的每一个二进制位 1 变成 0，0 变成 1。 

1. C++ 中哪些变量类型可以用于保存整数？
char  - 1 个字节 - 8 bits
char c1 = 255; // c1 = 0b11111111


short - 2 个字节 - 16 bits
int   - 4 个字节 - 32 bits
long  - 8 个字节 - 64 bits
*/

/*
其实二进制数字本身是不分正负的，计算机只了解自己的 8 个二进制位里存的是什么
0bxxxxxxxx

人为就为这 8 个二进制位的解释制定了一些规则：MSB 作为符号位来处理
*/

#include <iostream>

using namespace std;

int main(int argc, char const *argv[])
{
  /* code */
  short s1 = 0b1111111111111111; // s1 = -1
  unsigned short s2 = 0b1111111111111111; // s2 = 2^16 - 1 = 65535
  //       正数二进制       负数二进制
  // 8     1000           1000
  // 4     0100           1100
  // 2     0010           1110
  // 1     0001           1111 / 11111111 / 

  // 当我们想表达一个负数的时候，这个负数的表达方式和保存这个负数的变量的长度有关。
  cout << "s1=" << s1 << " s2=" << s2 << endl;

  
  return 0;
}

/*
n = 6
for (i = 1; i * i < n; ++i) {
  if (n % i == 0) {
    fac.push_back(i);
  }
}

for (int k = 0; k < fac.size(); ++k) {
  cout << fac[k] << " ";
}

fac
[1, 2], 6/2, 6/1
*/